#ifndef CLINK_ROUTER_REGEXROUTEHANDLER_H
#define CLINK_ROUTER_REGEXROUTEHANDLER_H

#include "BaseRouteHandler.h"
#include <functional>
#include <regex>
#include "../CLink_Export.h"

namespace CLink
{
namespace Router
{

/**
 * @brief 正则表达式路由处理器
 *
 * 使用正则表达式进行路由匹配，支持更复杂的路由模式。
 */
class CLINK_CLASS RegexRouteHandler : public BaseRouteHandler
{
public:
    /**
     * @brief 路由处理函数类型
     */
    using HandlerFunction = std::function<void(RequestContext &)>;

    /**
     * @brief 构造函数
     * @param pathPattern 路径正则表达式模式
     * @param method HTTP方法
     * @param handler 处理函数
     * @param priority 优先级
     */
    RegexRouteHandler(const std::string &pathPattern,
                        const std::string &method,
                        HandlerFunction handler,
                        int priority = 0);

    /**
     * @brief 处理HTTP请求
     * @param context 请求上下文对象
     * @return 如果请求被处理返回true，否则返回false
     */
    bool handle(RequestContext &context) override;

    /**
     * @brief 检查路由是否匹配请求
     * @param context 请求上下文，包含请求、响应和路由参数
     * @return 如果路由匹配返回true，否则返回false
     */
    bool matches(const RequestContext &context) const override;

    /**
     * @brief 设置处理函数
     * @param handler 处理函数
     * @return 当前对象的引用，支持链式调用
     */
    RegexRouteHandler &setHandler(HandlerFunction handler);

    /**
     * @brief 添加命名捕获组
     * @param name 捕获组名称
     * @return 当前对象的引用，支持链式调用
     */
    RegexRouteHandler &addNamedGroup(const std::string &name);

private:
    HandlerFunction m_handler;             ///< 路由处理函数
    std::vector<std::string> m_groupNames; ///< 命名捕获组列表

    /**
     * @brief 提取正则表达式捕获组
     * @param context 请求上下文，包含请求、响应和路由参数
     * @return 捕获组值列表
     */
    std::vector<std::string> extractCaptureGroups(const RequestContext &context) const;
};

/**
 * @brief 创建正则表达式GET路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexGet(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "GET", handler, priority);
}

/**
 * @brief 创建正则表达式POST路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexPost(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "POST", handler, priority);
}

/**
 * @brief 创建正则表达式PUT路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexPut(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "PUT", handler, priority);
}

/**
 * @brief 创建正则表达式DELETE路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexDelete(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "DELETE", handler, priority);
}

/**
 * @brief 创建正则表达式PATCH路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexPatch(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "PATCH", handler, priority);
}

/**
 * @brief 创建正则表达式HEAD路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexHead(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "HEAD", handler, priority);
}

/**
 * @brief 创建正则表达式OPTIONS路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexOptions(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "OPTIONS", handler, priority);
}

/**
 * @brief 创建正则表达式TRACE路由处理器的辅助函数
 * @param pathPattern 路径正则表达式模式
 * @param handler 处理函数
 * @param priority 优先级
 * @return 路由处理器的智能指针
 */
CLINK_FUNCTION inline std::shared_ptr<RegexRouteHandler> RegexTrace(
    const std::string &pathPattern,
    RegexRouteHandler::HandlerFunction handler,
    int priority = 0)
{
    return std::make_shared<RegexRouteHandler>(pathPattern, "TRACE", handler, priority);
}

} // namespace Router
} // namespace CLink

#endif // CLINK_ROUTER_REGEXROUTEHANDLER_H